Expect is a program that “talks” to other interactive programs according to a script. Following the script, Expect knows what can be expected from a program and what the correct response should be. An interpreted language provides branching and high-level control structures to direct the dialogue. In addition, the user can take control and interact directly when desired, afterward returning control to the script.
expect基础语法
示例:
1 | # 命令行参数 |
spwan命令
spawn命令用于启动一个进程, 后边接上你要执行的命令,例如spawn ssh relay01.baidu.com
interact命令
interact命令用于脚本执行完简单的命令后人手动介入,只在所属的spawn进程空间有效
expect的三种使用格式
并行:只要其中的任何一个pattern能够匹配,那么这个expect就算是完成了一次匹配
expect { pattern1 { command2 } pattern2 { command2 } } # 示例 expect { "hi" { send "You said hi\r" } "hello" { send "Hello yourself\r" } "bye" { send "That was unexpected\r" } }
串行:所有的匹配被依次满足了之后才算整个语句完成
expect pattern command expect pattern2 command2 # 串行示例 expect "username:" send "$userid\r" expect "password:" { send "$mypassword\r" } # 利用exp_continue并行实现串行,continue执行下一个pattern expect { "*yes/no" { send "yes\r"; exp_continue } "*password:" { send "$mypassword\r" } }
shell脚本接收多个参数
- expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个,第三个….参数
- $argc为命令行参数的个数,$argv0为脚本名字本身,$argv为命令行参数。[lrange $argv 0 0]表示第1个参数,[lrange $argv 0 4]为第一个到第五个参数。
- 执行
./test.sh 1 2 3
,脚本内容如下:
1 | #!/usr/bin/expect -d |
bash脚本直接调用expect进行交互
- Here document实现, expect脚本可以使用bash中定义的变量
1 | #!/bin/bash |
- 直接使用set来定义变量并在expect脚本中使用
1 | #!/bin/bash |
如果希望保持登录,去掉上面代码的ssh后的命令列表并且将expect eof改成interact即可
更多示例
开发机登陆脚本示例
1 | #!/usr/bin/expect |